package initialize

import (
	"context"
	"strconv"

	"github.com/flipped-aurora/gin-vue-admin/server/global"
	model "github.com/flipped-aurora/gin-vue-admin/server/model/system"
	"go.uber.org/zap"
)

func Menu(ctx context.Context) (sysTaskId, sysTaskLogId uint) {

	var baseMenu model.SysBaseMenu
	if err := global.GVA_DB.Where("path = ?", "admin").Where("name = ?", "superAdmin").First(&baseMenu).Error; err != nil {
		global.GVA_LOG.Error("查询基础菜单失败", zap.Error(err))
		return
	}
	// 定时任务菜单
	sysTaskMenu := model.SysBaseMenu{
		MenuLevel: 0,
		ParentId:  baseMenu.ID,
		Path:      "sysTask",
		Name:      "sysTask",
		Hidden:    false,
		Component: "plugin/sysTask/view/sysTask.vue",
		Sort:      10,
		Meta: model.Meta{
			KeepAlive:   false,
			DefaultMenu: false,
			Title:       "定时任务",
			Icon:        "aim",
			CloseTab:    false,
		},
	}

	// 任务日志菜单
	sysTaskLogMenu := model.SysBaseMenu{
		MenuLevel: 0,
		ParentId:  baseMenu.ID,
		Path:      "sysTaskLog",
		Name:      "sysTaskLog",
		Hidden:    false,
		Component: "plugin/sysTask/view/sysTaskLog.vue",
		Sort:      11,
		Meta: model.Meta{
			KeepAlive:   false,
			DefaultMenu: false,
			Title:       "任务日志",
			Icon:        "aim",
			CloseTab:    false,
		},
	}

	// 检查并创建定时任务菜单
	var existingSysTaskMenu model.SysBaseMenu
	err := global.GVA_DB.Where("name = ?", sysTaskMenu.Name).First(&existingSysTaskMenu).Error
	if err != nil {
		// 菜单不存在，创建新菜单
		err = global.GVA_DB.Create(&sysTaskMenu).Error
		if err != nil {
			global.GVA_LOG.Error("创建定时任务菜单失败", zap.Error(err))
		} else {
			global.GVA_LOG.Info("定时任务菜单创建成功", zap.Uint("menuId", sysTaskMenu.ID))
		}
		sysTaskId = sysTaskMenu.ID
	} else {
		// 菜单已存在，使用现有ID
		sysTaskId = existingSysTaskMenu.ID
		global.GVA_LOG.Info("定时任务菜单已存在", zap.Uint("menuId", sysTaskId))
	}

	// 检查并创建任务日志菜单
	var existingSysTaskLogMenu model.SysBaseMenu
	err = global.GVA_DB.Where("name = ?", sysTaskLogMenu.Name).First(&existingSysTaskLogMenu).Error
	if err != nil {
		// 菜单不存在，创建新菜单
		err = global.GVA_DB.Create(&sysTaskLogMenu).Error
		if err != nil {
			global.GVA_LOG.Error("创建任务日志菜单失败", zap.Error(err))
		} else {
			global.GVA_LOG.Info("任务日志菜单创建成功", zap.Uint("menuId", sysTaskLogMenu.ID))
		}
		sysTaskLogId = sysTaskLogMenu.ID
	} else {
		// 菜单已存在，使用现有ID
		sysTaskLogId = existingSysTaskLogMenu.ID
		global.GVA_LOG.Info("任务日志菜单已存在", zap.Uint("menuId", sysTaskLogId))
	}

	return sysTaskId, sysTaskLogId
}

// AuthorityMenu 为指定权限添加菜单关系
func AuthorityMenu(ctx context.Context, sysTaskId, sysTaskLogId uint) {
	// 创建权限菜单关系记录
	authorityMenus := []model.SysAuthorityMenu{
		{
			MenuId:      strconv.Itoa(int(sysTaskId)),
			AuthorityId: "888",
		},
		{
			MenuId:      strconv.Itoa(int(sysTaskLogId)),
			AuthorityId: "888",
		},
	}

	// 检查是否已存在相同的记录，避免重复插入
	for _, am := range authorityMenus {
		var count int64
		global.GVA_DB.Model(&model.SysAuthorityMenu{}).
			Where("sys_base_menu_id = ? AND sys_authority_authority_id = ?", am.MenuId, am.AuthorityId).
			Count(&count)

		if count == 0 {
			// 记录不存在，插入新记录
			err := global.GVA_DB.Create(&am).Error
			if err != nil {
				global.GVA_LOG.Error("插入权限菜单关系失败", zap.String("menuId", am.MenuId), zap.String("authorityId", am.AuthorityId), zap.Error(err))
			}
		}
	}
}
